if ($tt == OP_DOT)
{
- $this->t->mustMatch(TOKEN_IDENTIFIER);
+ $tt = $this->t->get();
+ if (!$this->isKeyword($tt) && $tt !== TOKEN_IDENTIFIER)
+ throw $this->t->newSyntaxError("Unexpected token; token identifier or keyword expected.");
+
array_push($operands, new JSNode($this->t, OP_DOT, array_pop($operands), new JSNode($this->t)));
}
else
}
else
{
+ // Accept keywords as property names by treating
+ // them similarly with identifiers
+ if ($this->isKeyword($tt))
+ $tt = TOKEN_IDENTIFIER;
+
switch ($tt)
{
case TOKEN_IDENTIFIER:
return $n;
}
+
+ private function isKeyword($tt)
+ {
+ switch ($tt) {
+ case KEYWORD_BREAK:
+ case KEYWORD_CASE:
+ case KEYWORD_CATCH:
+ case KEYWORD_CONST:
+ case KEYWORD_CONTINUE:
+ case KEYWORD_DEBUGGER:
+ case KEYWORD_DEFAULT:
+ case KEYWORD_DELETE:
+ case KEYWORD_DO:
+ case KEYWORD_ELSE:
+ case KEYWORD_ENUM:
+ case KEYWORD_FALSE:
+ case KEYWORD_FINALLY:
+ case KEYWORD_FOR:
+ case KEYWORD_FUNCTION:
+ case KEYWORD_IF:
+ case KEYWORD_IN:
+ case KEYWORD_INSTANCEOF:
+ case KEYWORD_NEW:
+ case KEYWORD_NULL:
+ case KEYWORD_RETURN:
+ case KEYWORD_SWITCH:
+ case KEYWORD_THIS:
+ case KEYWORD_THROW:
+ case KEYWORD_TRUE:
+ case KEYWORD_TRY:
+ case KEYWORD_TYPEOF:
+ case KEYWORD_VAR:
+ case KEYWORD_VOID:
+ case KEYWORD_WHILE:
+ case KEYWORD_WITH:
+ return true;
+ default:
+ return false;
+ }
+ }
}
class JSCompilerContext
// Boolean minification (!0 / !1)
[ "var a = { b: true };", "var a={b:!0};" ],
- [ "var a = { true: 12 };", "var a={true:12};", false ],
- [ "a.true = 12;", "a.true=12;", false ],
+ [ "var a = { true: 12 };", "var a={true:12};" ],
+ [ "a.true = 12;", "a.true=12;" ],
[ "a.foo = true;", "a.foo=!0;" ],
[ "a.foo = false;", "a.foo=!1;" ],
];